<template>
  <div>

  </div>
</template>

<script lang="ts">
import { ref, defineComponent, getCurrentInstance,onMounted } from 'vue'
export default defineComponent({
  name: 'Common',
  setup: () => {
    let {ctx}:any = getCurrentInstance();

    onMounted(() => {
        compareWay();
        MathWay();
        StringWay();
        ArrayWay();
    })

    const compareWay = () =>{
        console.log("比较运算");

        console.log("gt:判断第一个参数是否是大于第二个参数");
        console.log(ctx.$R.gt(2)(1));// true
        console.log(ctx.$R.gt('a')('z')); // false

        console.log("gte:判断第一个参数是否大于等于第二个参数");
        console.log(ctx.$R.gte(2)(2));//true
        console.log(ctx.$R.gte('a')('z'));// false

        console.log("lt:判断第一个参数是否小于第二个从参数");
        console.log(ctx.$R.lt(2)(1)); // false
        console.log(ctx.$R.lt('a')('z')); //false

        console.log("lte:判断第一个参数是否小于等于第二个参数");
        console.log(ctx.$R.lte(2)(1));// true
        console.log(ctx.$R.lte('a')('z'));//true

        console.log("equal:比较两个值是否相等");
        console.log(ctx.$R.equals(1)(1)) // true
        console.log(ctx.$R.equals(1)("1")); // false
        console.log(ctx.$R.equals([1,2,3])([1,2,3])); // true

        console.log("eqBy:比較两个值传入指定函数的运算结果是否相等");
        console.log(ctx.$R.eqBy(Math.abs,5)(-5)); // true
    }

    const MathWay = () =>{
        console.log("数学运算");

        console.log(ctx.$R.add(7)(10)); //17
        console.log(ctx.$R.subtract(10)(8)); //2
        console.log(ctx.$R.multiply(2)(5)); //10
        console.log(ctx.$R.divide(71)(100)); // 0.71
        console.log(ctx.$R.median(2,9,7));//7
        console.log(ctx.$R.median(2,7,9,10));//8 median中位数
    }

    const StringWay = () =>{
        console.log("字符串处理");

        ctx.$R.split(".")('a.b.c'); // ['a','b','c']

    }

    const typeWay = () =>{
      console.log('isNil:检验输入的值是否是null or undefined');
      ctx.$R.isNil(null); //=> true
      ctx.$R.isNil(undefined); //=> true
      ctx.$R.isNil(0); //=> false
      ctx.$R.isNil([]); // => false

      console.log("is:判断值得类型是否是左边参数类型");
      ctx.$R.is(Object,{}); //=> true
      ctx.$R.is(Number,1);
      ctx.$R.is(Object,1); // => false
      ctx.$R.is(String,'s'); //=> true
      ctx.$R.is(String,new String('')); // => true
      ctx.$R.is(Object,new String('')); // => true
      ctx.$R.is(Object,'s'); //=>false
      ctx.$R.is(Number,{}); // => false

      console.log("type:获取参数的类型");
      ctx.$R.type(/[A-z]/); //=>"RegExp";
      ctx.$R.type(()=>{}); // => "Function"
      
    }

    const ArrayWay = () =>{
        console.log("数组的操作");

        console.log("contain:如果数组包含某个成员返回true");
        ctx.$R.contains(3)([1,2,3]) // true
        ctx.$R.contains({name:'real'})([{name:"real"}]) // true
        ctx.$R.contains([42])([42]); // true

        console.log("all:所有成员都满足指定函数时,返回true,否则返回false");
        let equals3 = ctx.$R.equals(3);
        ctx.$R.all(equals3)([3,3]); // true
        ctx.$R.all(equals3)([3,1]); // false

        console.log("any:只要有一个成员满足条件,就返回true");
        console.log("没有成员满足条件时,返回true");
        let isEven = (n:number) => n%2 ===0;
        ctx.$R.none(isEven)([1,3,5,7]) // true
        ctx.$R.none(isEven)([1,3,4]) // FALSE

        console.log("数组的截取和添加");
        console.log("head: 返回数组的第一个成员");
        ctx.$R.head(['fi','fo','fum']); //'fi'
        ctx.$R.head([]) //undefined
        ctx.$R.head('abc') //'a'
        ctx.$R.head() //‘’

        console.log("last:返回数组的最后一个成员,其余和head一样");

        console.log("tail：返回第一个成员以外的所有成员组成的新数组");
        ctx.$R.tail([1,2,3]) //[2,3]
        ctx.$R.tail([1]) //[]
        ctx.$R.tail([]) //[]
        ctx.$R.tail('abc') //'bc'
        ctx.$R.tail('a') //''
        ctx.$R.tail() //''

        console.log("init:返回最后一个成员以外的所有成员组成的数组");
        ctx.$R.init([1,2,3]) //[1,2]
        ctx.$R.init([1]) //[]
        ctx.$R.init([]) //[]
        ctx.$R.init('abc') //'ab'
        ctx.$R.init('a') //''
        ctx.$R.init() //''

        console.log("nth:取出指定位置的成员");
        ctx.$R.take(1)(['a','b','c']) //['a']
        ctx.$R.take(2)(['a','b','c']) //['a','b']
        ctx.$R.take(3)(['a','b','c']) //['a','b','c']
        ctx.$R.take(3)('ramda') //'ram'
        
        console.log("takeList：取出后n个成员");
        ctx.$R.takeLast(1)(['a','b','c']) //['c']
        ctx.$R.takeLast(2)(['a','b','c']) //['b','c']
        ctx.$R.takeLast(3)(['a','b','c']) //['a','b','c']
        ctx.$R.takeLast(4)(['a','b','c']) //['a','b','c']
        ctx.$R.takeLast(3)('ramda') //'mda'

        console.log("slice: 从开始位置开始,到结束位置");
        ctx.$R.slice(1,3)(['a','b','c','d']) // ['b','c']
        ctx.$R.slice(1,Infinity)(['a','b','c','d']) // ['b','c','d']

        console.log("remove:从开始位置开始移除n个成员");
        console.log("arr remove",ctx.$R.remove(2,3)(['a','b','c','d','e','f']));

        console.log("insert:在指定位置插入给指定");
        ctx.$R.insert(2,"xxx")([1,2,3,4]); //[1,2,'xxx',3,4]

        console.log("insertAll:在指定位置插入整个数组");
        ctx.$R.insertAll(2,['xx','yy'],[1,2,3,4]) //[1,2,'xx','yy',3,4]

        console.log("prepend:在数组头部插入一个元素");
        ctx.$R.prepend('fee')(['a','b']) // fee,a,b

        console.log("append:在数组尾部追加新成员");
        console.log("intersperse:在数组成员之间插入表示分隔的字符串");
        ctx.$R.intersperse("n")('ba','a');
        //['ba','n','a']

        console.log("join:给数组添加分隔符,并在成员之间添加分隔字符串");
        ctx.$R.join("|")([1,2,3]) // '1|2|3'


    }

    const doubleArrayWay = () =>{
        console.log('zip:将两个数组指定位置索引进行一一对应,放在一起,生成新的数组');
        ctx.$R.zip([1,2,3])(['a','b','c']); //[[1,'a'],[2,'b'],[3,'c']]

        console.log("zipObj:将两个数组,前一个数组作为键,后一个数组作为值,合并成对象");
        ctx.$R.zipObj(['a','b','c'])([1,3,4]); //{a:1,b:3,c:4}

        console.log("xprod:将两个数组的成员两两混合,生成一个新数组");
        ctx.$R.xprod([1,2])(['a',"b"])
        // 类似穷举所有的配对可能性
        // ['1','a'] [1,'b'],[2,'a'],[2,'b']

        console.log("intersection:返回两个数组相同的成员组成的新数组");
        ctx.$R.intersection([1,2,3,4])([3,4,5])
        //[3,4]
        //ctx.$R.intersectionWith可以用来求等对象

        console.log("mergeAll:将数组的成员合并成一个对象");
        ctx.$R.mergeAll([{foo:1},{bar:2},{baz:3}]);
        //{foo:1,bar:2,baz:3}
        ctx.$R.mergeAll([{foo:1},{foo:2},{bar:2}]);
        //{foo:2,bar:2}
    }


    return { compareWay,MathWay,StringWay,typeWay  }
  }
})
</script>

<style scoped>
a {
  color: #42b983;
}

label {
  margin: 0 0.5em;
  font-weight: bold;
}

code {
  background-color: #eee;
  padding: 2px 4px;
  border-radius: 4px;
  color: #304455;
}
</style>
